/*
 * MEntidad.java
 *
 * Created on 30 de agosto de 2006, 12:39 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package ig.formato.modelo;

import ig.formato.gui.app.PEntidad;
import ig.basic.util.IModelo;
import ig.formato.dto.VEntidadDTO;
import ig.formato.util.IGFormatoException;
import ig.formato.util.MasterConnection;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author jsanchez
 */
public class MEntidad implements IModelo {

    /**
     * Creates a new instance of MEntidad
     */
    PEntidad panel = null;
    ig.formato.dao.EntidadDao dao = new ig.formato.dao.EntidadDao();
    ig.formato.dao.VEntidadDao daoV = new ig.formato.dao.VEntidadDao();
    ig.formato.dto.EntidadDTO dto = null;
    //private Collection cc = null;

    public MEntidad(PEntidad panel) {
        this.panel = panel;
    }

    public void guardar() throws IGFormatoException {
        Object myObj = this.dao.existe(this.dto);
        String NM = "Entidad";
        if (!(myObj instanceof Boolean)) {
            if (this.dto.getId() == null) {
                throw new IGFormatoException("Ya existe una " + NM + " con este nombre", "Cambie el nombre");
            } else if ((myObj instanceof Integer) && !((Integer) myObj).equals(dto.getId())) {
                throw new IGFormatoException("Ya existe una " + NM + " con este nombre", "Cambie el nombre");
            }
        }
        try {
            dao.setAutoCommit(false);
            Collection<VEntidadDTO>  c=this.dto.getId()!=null?daoV.buscarPorEntidad(this.dto.getId()):new ArrayList<VEntidadDTO>();
            for (VEntidadDTO vEntidadDTO : c) {
                daoV.eliminar(vEntidadDTO.getId());
            }
            Integer _id=dao.guardar(this.dto);            
            for (VEntidadDTO dTO : panel.loadDataOnTable()) {
                dTO.setId(null);
                dTO.setId_entidad(_id);
                daoV.guardar(dTO);
            }

            dao.commit();
        } catch (IGFormatoException e) {
            dao.rollback();
            throw e;
        }
    }

    public Collection buscar() throws IGFormatoException {
        //cc = new ig.formato.dao.ConexionDao().buscarTodos();
        return dao.buscarTodos();
    }

    public void modificar() throws IGFormatoException {
    }

    public void nuevo() throws IGFormatoException {
        dto = new ig.formato.dto.EntidadDTO();
        //cc = new ig.formato.dao.ConexionDao().buscarTodos();
    }

    public void eliminar() throws IGFormatoException {
        try {
            dao.setAutoCommit(false);
            Collection<VEntidadDTO>  c=this.dto.getId()!=null?daoV.buscarPorEntidad(this.dto.getId()):new ArrayList<VEntidadDTO>();
            for (VEntidadDTO vEntidadDTO : c) {
                daoV.eliminar(vEntidadDTO.getId());
            }
            panel.showDataOnTable(new ArrayList());
            dao.eliminar(this.dto.getId());
            dao.commit();
        } catch (IGFormatoException e) {
            dao.rollback();
            throw e;
        }
    }

    public void salir() throws IGFormatoException {
//        MasterConnection.getMasterConnection().closeConnectionMaster();
    }

    public void imprimir() throws IGFormatoException {
    }

    public java.sql.Connection getConectionMaster() throws java.sql.SQLException, ClassNotFoundException, Exception {
        return this.dao.getConnectionIgFormato();
    }

    public Object getTO() throws IGFormatoException {        
        return dto;
    }

    public void cancelar() throws IGFormatoException {
        this.setId(this.dto.getId());
    }

    public void setId(Integer id) {
        if (id != null) {
            try {
                dto = (ig.formato.dto.EntidadDTO) this.dao.buscar(id);
                panel.showDataOnTable(this.daoV.buscarPorEntidad(dto.getId()));
            } catch (IGFormatoException ex) {
                ex.printStackTrace();
            }
        }
    }

//    public Collection getFunetesDeDatos() {
//        return this.cc;
//    }

    public void setClonar(boolean flag) {
    }

    public boolean isClonar() {
        return false;
    }
}